// 迭代器 [Iterator]

const set = new Set(['foo', 'bar', 'baz'])

const iterator = set[Symbol.iterator]()

console.log(iterator.next())
console.log(iterator.next())
console.log(iterator.next())
console.log(iterator.next())
console.log(iterator.next())
console.log(iterator.next())

// 实现可迭代接口
// const obj = {
//     [Symbol.iterator]: function(){ //Iterator接口
//         return {
//             next: function(){ //IteratorREsult
//                 return {
//                     value: 'liuchao',
//                     done: true
//                 }
//             }
//         }
//     }
// }

const obj = {
    store: ['foo', 'bar', 'baz'],
    [Symbol.iterator]: function(){ //Iterator接口
        let index = 0
        const self = this
        return {
            next: function(){ //IteratorREsult
                const result = {
                    value: self.store[index],
                    done: index >= self.store.length
                }
                index++
                return result
            }
        }
    }
}

for(const item of obj){
    console.log(item)
}


// 迭代器模式

// 场景: 多人协同开发一个任务清单应用

// 我的代码=====================

const todos = {
    life: ['吃饭', '睡觉', '打豆豆'],
    learn: ['语文', '数学', '英语'],
    work: ['喝茶'],

    each(callback){
        const all = [].concat(this.life, this.learn, this.work)
        for(const item of all){
            callback(item)
        }
    },

    [Symbol.iterator]: function(){
        const all = [...this.life, ...this.learn, ...this.work]
        let index = 0
        return {
            next: function(){
                return {
                    value: all[index],
                    done: index++ >= all.length
                }
            }
        }
    }
}

// 你的代码=====================
// for(const item of todos.life){
//     console.log(item)
// }
// for(const item of todos.learn){
//     console.log(item)
// }
// for(const item of todos.work){
//     console.log(item)
// }

todos.each(item => {
    console.log(item)
})
console.log('-----------------')
for(const item of todos){
    console.log(item)
}

















